/**
 * 认证与用户权限管理Hook模块 - 简化版
 * 
 * 本模块提供了简洁的用户认证与权限管理功能，参考Vue项目实现
 * - 用户登录和注销
 * - 用户信息管理
 * - 权限验证
 */
import { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { login as loginApi } from '../api/authApi';
import { RootState, UserInfo } from '../store/types';

// 导入简化的认证工具
import auth from '../utils/auth';
// 注释掉直接导入，改用动态导入以避免类型错误
// import { fetchUserRights } from '../store/features/userSlice';

/**
 * 登录参数接口
 */
export interface LoginParams {
  username: string;
  password: string;
  captcha?: string;
}

/**
 * 登录结果接口
 */
export interface LoginResult {
  success: boolean;
  message?: string;
  user?: UserInfo;
  token?: string;
}

/**
 * API错误响应接口
 */
interface ErrorResponseData {
  message?: string;
  msg?: string;
  [key: string]: unknown;
}

interface ErrorResponse {
  data?: ErrorResponseData;
  [key: string]: unknown;
}

/**
 * 认证Hook - 简化版
 * 提供登录、登出和权限验证功能
 */
export function useAuth() {
  // 不再使用navigate，导航由组件自己控制
  const dispatch = useDispatch();
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);

  /**
   * 登录方法
   * @param params 登录参数
   */
  const login = async (params: LoginParams): Promise<LoginResult> => {
    setLoading(true);
    setError(null);

    try {
      // 调用API登录
      const response = await loginApi(params.username, params.password, params.captcha);
      
      // 检查响应
      if (response.ActionType === "OK" || response.code === 0 || response.code === 200) {
        // 获取token和用户数据
        const token = response.token || (response.data && response.data.token);
        const userData = response.data;
        
        // 保存token和用户信息
        if (token) {
          // 先更新localStorage
          auth.setToken(token);
          // 再更新Redux状态
          dispatch({ type: 'user/setToken', payload: token });
        }
        
        if (userData) {
          // 先更新localStorage
          auth.setUserInfo(userData);
          // 再更新Redux状态
          dispatch({ type: 'user/setUser', payload: userData });
          
          // 保存权限信息
          if (userData.role?.rights && Array.isArray(userData.role.rights)) {
            // 先更新localStorage
            auth.setUserRights(userData.role.rights);
            // 再更新Redux状态
            dispatch({ type: 'user/setRights', payload: userData.role.rights });
          }
          
          // 保存侧边栏数据
          if (response.sidebarItems) {
            localStorage.setItem('sidebarItems', JSON.stringify(response.sidebarItems));
        }
        
          // 派发自定义事件，通知App组件更新
          const event = new CustomEvent('token-updated', { detail: { token } });
          window.dispatchEvent(event);
        }
        
        setLoading(false);
        return { success: true, user: userData, token };
      } else {
        // 登录失败
        const msg = response.msg || response.message || '登录失败';
        setError(msg);
        setLoading(false);
        return { success: false, message: msg };
      }
    } catch (err: unknown) {
      // 处理错误，尝试提取可能的错误消息
      let errorMsg = '登录过程中发生错误';
      
      if (err && typeof err === 'object') {
        const errorObj = err as {
          message?: string;
          msg?: string;
          response?: ErrorResponse;
        };
        
        errorMsg = errorObj.message || 
                  errorObj.msg || 
                  errorObj.response?.data?.message ||
                  errorObj.response?.data?.msg ||
                  errorMsg;
      }
      
      setError(errorMsg);
      setLoading(false);
      return { success: false, message: errorMsg };
    }
  };

  /**
   * 登出方法
   */
  const logout = () => {
    // 先清除localStorage
    auth.clearUserInfo();
    // 再更新Redux状态
    dispatch({ type: 'user/clearUser' });
    
    // 派发自定义事件，通知App组件更新
    const event = new CustomEvent('token-updated', { detail: { token: null } });
    window.dispatchEvent(event);
  };

  /**
   * 检查用户是否有特定权限
   * @param permissionKey 权限键名
   */
  const hasPermission = (permissionKey: string): boolean => {
    return auth.hasPermission(permissionKey);
  };

  return {
    login,
    logout,
    hasPermission,
    loading,
    error,
    setError
  };
}

/**
 * 用户信息Hook - 简化版
 * 提供当前登录用户信息
 */
export function useCurrentUser() {
  // 从Redux状态获取用户信息
  const userInfo = useSelector((state: RootState) => state.user.userInfo);
  
  return {
    userInfo: userInfo || auth.getUserInfo(),
    isAuthenticated: !!userInfo || auth.isAuthenticated()
  };
}

/**
 * 用户权限Hook - 简化版
 * 提供当前用户权限列表
 */
export function useUserRights() {
  // 从Redux状态获取权限列表
  const rights = useSelector((state: RootState) => state.user.rights);
  
  return {
    rights: rights.length ? rights : auth.getUserRights(),
    hasRight: (key: string) => rights.includes(key) || auth.hasPermission(key)
  };
} 